#include<sys\\stat.h>
#include<sys\\types.h>
#include<direct.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>

#define mSol 1
#define mTerra 3.003167261575587e-6
#define mJupiter 9.543512141169373e-4

#define PI 3.141592653589793
#define G 2.959572553206070e-004
#define perielioTerra 0.983235919814466
#define vPerielioTerra 6.389661159796174
#define perielioSaturno 9.041238312224186
#define vPerielioSaturno 2.147466180479533
#define excentricidadeTerra 0.0167

void inicializacao(void);
void coordenadasCentroMassa(void);
void artigo1_1(void);
void artigo1_2(void);
void artigo1_3(void);
void artigo2(void);
void criarArquivos(void);
void escreverArquivos(double tempo);
void calcularDistancia(double *v,double *distancia, int dimensao, int corpos);
void F3(double *dx, double *z, double *distancia, double *m, int dimensao, double t);
void jacobiana3C(double* j, double m1,double m2,double m3,double r1x,double r1y,double r2x,double r2y,double r3x,double r3y,int tamanho);
void produtoEscalarVetor(double* v,double a,int tamanho, double *resultado);
void produtoEscalar(double* v,double* v2,int tamanho, double *resultado);
void somaVetores(double* v,double* v2,int tamanho, double *resultado);
void produtoMatrizVetor(double *J,double* delta,int tamanho, double *resultado);
void fecharArquivos(void);

double  *m, *z, *zH,  tFinal,    dt, temp, *J,*temp2,*temp3,*k1,*k2,*k3,*k4,*temp4,*temp5;
double  *dx, *distancia,tempo;
int dimensao, n, T, corpos,intervaloGravacao,*N,numeroNs;
//2*N+3
FILE *f[9];
char *exemplo,*aux,*SO;
clock_t inicio,fim,total;

int main(int argc, char *argv[])
{
	int i,j;
	inicio=clock();

	dimensao=2;

	SO=(char *)calloc(1, sizeof(char));

	SO=argv[1];
	intervaloGravacao=atoi(argv[2]);
	tFinal=atof(argv[3]);
	n=atof(argv[4]);

	corpos=3;
	inicializacao();
	criarArquivos();
	escreverArquivos(0.0);

	int tamanho=4*corpos*dimensao+2;
	for(i=1;i<T;i++)
	{
		F3(dx, z, distancia, m, 2, dt*(i-1));
		produtoEscalarVetor(dx,dt,tamanho,k1);

		produtoEscalarVetor(k1,0.5,tamanho,temp5);
		somaVetores(z,temp5,tamanho,temp5);
		F3(dx, temp5, distancia, m, 2, dt*(i-1)+0.5*dt);
		produtoEscalarVetor(dx,dt,tamanho,k2);

		produtoEscalarVetor(k2,0.5,tamanho,temp5);
		somaVetores(z,temp5,tamanho,temp5);
		F3(dx, temp5, distancia, m, 2, dt*(i-1)+0.5*dt);
		produtoEscalarVetor(dx,dt,tamanho,k3);

		somaVetores(z,k3,tamanho,temp5);
		F3(dx, temp5, distancia, m, 2, dt*(i-1)+dt);
		produtoEscalarVetor(dx,dt,tamanho,k4);

		produtoEscalarVetor(k1,(1.0)/6,tamanho,temp5);
		somaVetores(z,temp5,tamanho,z);
		produtoEscalarVetor(k2,(1.0)/3,tamanho,temp5);
		somaVetores(z,temp5,tamanho,z);
		produtoEscalarVetor(k3,(1.0)/3,tamanho,temp5);
		somaVetores(z,temp5,tamanho,z);
		produtoEscalarVetor(k4,(1.0)/6,tamanho,temp5);
		somaVetores(z,temp5,tamanho,z);

		if(i%intervaloGravacao==0)
		{
			escreverArquivos((i-1)*dt);
		}
	}

	int minutos=0;
	int segundos=0;
	int horas=0;
	tempo=0;
	int tempo2=0;

	fim=clock();
	total=fim-inicio;
	tempo=(double)total/CLOCKS_PER_SEC;
	tempo2=(int)tempo;
	horas=(tempo2/3600);
	minutos=(tempo2/60)-horas*60;
	segundos=(tempo2 % 60);
	printf("%d h %d min %d s\n",horas, minutos ,segundos);
	printf("%lf \n",tempo);

	fecharArquivos();

	return 0;
}



void inicializacao(void)
{
	int i;
	T=(int)pow(2.0,n)+1;
	dt=tFinal/(T-1);

	aux=(char*)calloc(100,sizeof(char));
	m =(double *)calloc(corpos, sizeof(double));
	z =(double *)calloc(4*corpos*dimensao+2, sizeof(double));
	zH =(double *)calloc((4*corpos*dimensao+2)*5, sizeof(double));
	dx =(double *)calloc(4*corpos*dimensao+2, sizeof(double));
	distancia =(double *)calloc(corpos*corpos, sizeof(double));
	J=(double *)calloc(pow(2*corpos*dimensao,2), sizeof(double));
	k1 =(double *)calloc(4*corpos*dimensao+2, sizeof(double));
	k2 =(double *)calloc(4*corpos*dimensao+2, sizeof(double));
	k3 =(double *)calloc(4*corpos*dimensao+2, sizeof(double));
	k4 =(double *)calloc(4*corpos*dimensao+2, sizeof(double));
	temp2=(double *)calloc(1, sizeof(double));
	temp3=(double *)calloc(1, sizeof(double));
	temp4=(double *)calloc(2*corpos*dimensao+2, sizeof(double));
	temp5=(double *)calloc(4*corpos*dimensao+2, sizeof(double));
	N=(int *)calloc(5, sizeof(int));

	for(i=0;i<5;i++)
	{
		N[i]=(i+1)*2;
	}

	//delta
	for(i=2*corpos*dimensao;i<4*corpos*dimensao;i++)
	{
		z[i]=0.288675134594813;
	}

	artigo2();
	coordenadasCentroMassa();
	//keplerT();
}

void coordenadasCentroMassa(void)
{
	int i,j;

	double M=0;
	double *rcm;
	rcm =(double *)calloc(dimensao, sizeof(double));

	for(i=0;i<corpos;i++)
	{
		M=M+m[i];
	}

	for(i=0;i<dimensao;i++)
	{
		rcm[i]=0;
		for(j=0;j<corpos;j++)
		{
			rcm[i]=rcm[i]+z[j*dimensao+i]*m[j];
		}
		rcm[i]=rcm[i]/M;
	}

	//transformacao
	for(i=0;i<corpos;i++)
	{
		for(j=0;j<dimensao;j++)
		{
			z[i*dimensao+j]= z[i*dimensao+j]-rcm[j];
		}
	}

	for(i=0;i<dimensao;i++)
	{
		z[3*dimensao+i]=-z[4*dimensao+i]-z[5*dimensao+i];
	}
}

void artigo1_1(void)
{
	//exemplo="/media/alan/Iomega HDD/artigo1-1";
	//exemplo="artigo1";
	exemplo="C:\\dados";
	mkdir(exemplo);
	exemplo="C:\\dados\\artigo1_1-RK4A-C\\";
	mkdir(exemplo);

	//corpo0
	m[0]=mSol;

	//corpo1

	m[1]=mJupiter;
	double periodo=4;
	z[1*dimensao+0]=G*m[0]*pow(periodo,2)/(4*pow(PI,2));
	z[1*dimensao+0]=pow(z[1*dimensao+0],(double)(1.0/3));
	z[4*dimensao+1]=m[1]*sqrt(G*m[0]/z[1*dimensao+0]);


	//corpo2
	m[2]=mTerra;

	double a=0.05;
	double e=0.4;
	double c=e*a;
	double b=sqrt(pow(a,2)-pow(c,2));
	z[2*dimensao+0]=a*(1-e);

	double P=sqrt(4*pow(PI,2)*pow(a,3)/(G*m[0]));
	double N=2*PI/P;
	z[5*dimensao+1]=m[2]*a*b*N/z[2*dimensao+0];
}

void artigo1_2(void)
{
	//exemplo="/media/alan/Iomega HDD/artigo1-1";
	//exemplo="artigo1";
	exemplo="C:\\dados";
	mkdir(exemplo);
	exemplo="C:\\dados\\artigo1_2-RK4A-C\\";
	mkdir(exemplo);

	//corpo0
	m[0]=mSol;

	//corpo1

	m[1]=mJupiter;
	double periodo=4;
	z[1*dimensao+0]=G*m[0]*pow(periodo,2)/(4*pow(PI,2));
	z[1*dimensao+0]=pow(z[1*dimensao+0],(double)(1.0/3));
	z[4*dimensao+1]=m[1]*sqrt(G*m[0]/z[1*dimensao+0]);


	//corpo2
	m[2]=mTerra;

	double a=0.05;
	double e=0.7;
	double c=e*a;
	double b=sqrt(pow(a,2)-pow(c,2));
	z[2*dimensao+0]=a*(1-e);

	double P=sqrt(4*pow(PI,2)*pow(a,3)/(G*m[0]));
	double N=2*PI/P;
	z[5*dimensao+1]=m[2]*a*b*N/z[2*dimensao+0];
}

void artigo1_3(void)
{
	//exemplo="/media/alan/Iomega HDD/artigo1-1";
	//exemplo="artigo1";
	exemplo="C:\\dados";
	mkdir(exemplo);
	exemplo="C:\\dados\\artigo1_3-RK4A-C\\";
	mkdir(exemplo);

	//corpo0
	m[0]=mSol;

	//corpo1

	m[1]=mJupiter;
	double periodo=4;
	z[1*dimensao+0]=G*m[0]*pow(periodo,2)/(4*pow(PI,2));
	z[1*dimensao+0]=pow(z[1*dimensao+0],(double)(1.0/3));
	z[4*dimensao+1]=m[1]*sqrt(G*m[0]/z[1*dimensao+0]);


	//corpo2
	m[2]=mTerra;

	double a=0.05;
	double e=0.8;
	double c=e*a;
	double b=sqrt(pow(a,2)-pow(c,2));
	z[2*dimensao+0]=a*(1-e);

	double P=sqrt(4*pow(PI,2)*pow(a,3)/(G*m[0]));
	double N=2*PI/P;
	z[5*dimensao+1]=m[2]*a*b*N/z[2*dimensao+0];
}

void artigo2(void)
{
	exemplo="C:\\dados";
	mkdir(exemplo);
	exemplo="C:\\dados\\artigo2-RK4A-C\\";
	mkdir(exemplo);

	//corpo0
	m[0]=0.3*mSol;

	//corpo1

	m[1]=mJupiter;
	double periodo=7.5;
	z[1*dimensao+0]=G*m[0]*pow(periodo,2)/(4*pow(PI,2));
	z[1*dimensao+0]=pow(z[1*dimensao+0],(double)(1.0/3));
	z[4*dimensao+1]=m[1]*sqrt(G*m[0]/z[1*dimensao+0]);


	//corpo2
	m[2]=mTerra;

	double a=0.05;
	double e=0.7;
	double c=e*a;
	double b=sqrt(pow(a,2)-pow(c,2));
	z[2*dimensao+0]=a*(1-e);

	double P=sqrt(4*pow(PI,2)*pow(a,3)/(G*m[0]));
	double N=2*PI/P;
	z[5*dimensao+1]=m[2]*a*b*N/z[2*dimensao+0];
}

void criarArquivos(void)
{
	int i;
	char *raiz,*diretorio,*aux,*barra;
	aux=(char*)calloc(1000,sizeof(char));
	raiz=(char*)calloc(100,sizeof(char));
	diretorio=(char*)calloc(100,sizeof(char));
	barra=(char*)calloc(2,sizeof(char));

	if(strcmp(SO,"w")==0)
	{
		barra="\\";
	}
	if(strcmp(SO,"l")==0)
	{
		barra="/";
	}

	strcpy(raiz,exemplo);
	//strcat(raiz,barra);
	//mkdir(raiz,S_IRWXU);
	mkdir(raiz);
	sprintf(aux,"%0.0lf",tFinal);
	strcat(raiz,aux);
	sprintf(aux,"%d",n);
	strcat(raiz,barra);
	//mkdir(raiz,S_IRWXU);
	mkdir(raiz);
	strcat(raiz,aux);
	strcat(raiz,barra);
	//mkdir(raiz,S_IRWXU);
	mkdir(raiz);

	for(i=0;i<corpos;i++)
	{
		strcpy(diretorio,raiz);
		strcat(diretorio,"r");
		sprintf(aux,"%d",(i+1));
		strcat(diretorio,aux);
		strcat(diretorio,".txt");
		f[i] = fopen(diretorio,"w");
		if(f[i] == NULL)
		{
			printf("Erro ao abrir arquivo!!!\n");
			exit(1);
		}
		strcpy(diretorio,raiz);
		strcat(diretorio,"p");
		sprintf(aux,"%d",(i+1));
		strcat(diretorio,aux);
		strcat(diretorio,".txt");
		f[i+corpos] = fopen(diretorio,"w");
		if(f[i+corpos] == NULL)
		{
			printf("Erro ao abrir arquivo!!!\n");
			exit(1);
		}
	}

	//arquivo tempo
	strcpy(diretorio,raiz);
	strcat(diretorio,"tempo.txt");

	f[2*corpos] = fopen(diretorio,"w");
	if(f[2*corpos] == NULL)
	{
		printf("Erro ao abrir arquivo tempo!!!\n");
		exit(1);
	}

	strcpy(diretorio,raiz);
	strcat(diretorio,"y.txt");

	f[2*corpos+1] = fopen(diretorio,"w");
	if(f[2*corpos+1] == NULL)
	{
		printf("Erro ao abrir arquivo y!!!\n");
		exit(1);
	}

	strcpy(diretorio,raiz);
	strcat(diretorio,"megno.txt");

	f[2*corpos+2] = fopen(diretorio,"w");
	if(f[2*corpos+2] == NULL)
	{
		printf("Erro ao abrir arquivo megno!!!\n");
		exit(1);
	}

	free(aux);
	free(raiz);
	free(diretorio);
}

void calcularDistanciaK(double *r,double *distancia, int dimensao)
{
	int i;

	distancia[0]=0;
	for(i=0;i<dimensao;i++)
	{
		distancia[0]+=pow(r[i],2);
	}
	distancia[0]=sqrt(distancia[0]);
}

void calcularDistancia(double *z,double *distancia, int dimensao, int corpos)
{
	int i,j,k;

	for(i=0;i<corpos;i++)
	{
		for(j=0;j<corpos;j++)
		{
			distancia[i*corpos+j]=0;
			for(k=0;k<dimensao;k++)
			{
				temp=(z[i*dimensao+k]-z[j*dimensao+k]);
				temp=temp*temp;
				distancia[i*corpos+j]=distancia[i*corpos+j]+temp;
			}
			distancia[i*corpos+j]=(double)sqrt((double)distancia[i*corpos+j]);
		}
	}
}

void F3(double *dx, double *z, double *distancia, double *m, int dimensao, double t)
{

	dx[0]=z[6]/m[0];
	dx[1]=z[7]/m[0];
	dx[2]=z[8]/m[1];
	dx[3]=z[9]/m[1];
	dx[4]=z[10]/m[2];
	dx[5]=z[11]/m[2];

	calcularDistancia(z,distancia,dimensao,corpos);

	dx[6]=      (G*m[0]*m[1]*(z[2]-z[0]))/(double)(pow(distancia[0*corpos+1],3));
	dx[6]=dx[6]+(G*m[0]*m[2]*(z[4]-z[0]))/(double)(pow(distancia[0*corpos+2],3));
	dx[7]=      (G*m[0]*m[1]*(z[3]-z[1]))/(double)(pow(distancia[0*corpos+1],3));
	dx[7]=dx[7]+(G*m[0]*m[2]*(z[5]-z[1]))/(double)(pow(distancia[0*corpos+2],3));

	dx[8]=      (G*m[1]*m[0]*(z[0]-z[2]))/(double)(pow(distancia[1*corpos+0],3));
	dx[8]=dx[8]+(G*m[1]*m[2]*(z[4]-z[2]))/(double)(pow(distancia[1*corpos+2],3));
	dx[9]=      (G*m[1]*m[0]*(z[1]-z[3]))/(double)(pow(distancia[1*corpos+0],3));
	dx[9]=dx[9]+(G*m[1]*m[2]*(z[5]-z[3]))/(double)(pow(distancia[1*corpos+2],3));

	dx[10]=       (G*m[2]*m[0]*(z[0]-z[4]))/(double)(pow(distancia[2*corpos+0],3));
	dx[10]=dx[10]+(G*m[2]*m[1]*(z[2]-z[4]))/(double)(pow(distancia[2*corpos+1],3));
	dx[11]=       (G*m[2]*m[0]*(z[1]-z[5]))/(double)(pow(distancia[2*corpos+0],3));
	dx[11]=dx[11]+(G*m[2]*m[1]*(z[3]-z[5]))/(double)(pow(distancia[2*corpos+1],3));

	jacobiana3C(J,m[0],m[1],m[2],z[0], z[1], z[2], z[3], z[4], z[5],2*dimensao*corpos);

	produtoMatrizVetor(J,z+12,2*corpos*dimensao,dx+12);

	produtoEscalar(dx+12,z+12,12,temp2);
	produtoEscalar(z+12,z+12,12,temp3);
	dx[24]=*temp2/(*temp3)*t;
	if(t==0)
	{
		t=1;
	}
	dx[25]=2*z[24]/t;
}

void jacobiana3C(double* j, double m1,double m2,double m3,double r1x,double r1y,double r2x,double r2y,double r3x,double r3y,int tamanho)
{
	double G2=(double)G;
	double t70 = r1x-r2x;
	double t71 = r1y-r2y;
	double t72 = r1x-r3x;
	double t73 = r1y-r3y;
	double t78 = r1x*2;
	double t83 = r2x*2;
	double t74 = t78-t83;
	double t75 = pow(t70,2);
	double t76 = pow(t71,2);
	double t77 = t75+t76;
	double t85 = r3x*2;
	double t79 = -1*t78+t85;
	double t80 = pow(t72,2);
	double t81 = pow(t73,2);
	double t82 = t80+t81;
	double t84 = pow((1/t77),(5.0/2.0));
	double t86 = r1y*2;
	double t87 = pow((1/t82),(5.0/2.0));
	double t88 = pow((1/t77),(3.0/2.0));
	double t89 = pow(t74,2);
	double t90 = G2 * m1 * m2 * t84 * t89* 3.0/4.0;
	double t91 = r2y*2;
	double t92 = t86-t91;
	double t93 = G2*m1*m2*t74*t84*t92*3.0/4.0;
	double t94 = pow((1.0/t82),(3.0/2.0));
	double t95 = t78-t85;
	double t96 = r3y*2.0;
	double t97 = t86-t96;
	double t98 = G2*m1*m3*t87*t95*t97*(3.0/4.0);
	double t99 = t93+t98;
	double t100 = G2*m1*m2*t88;
	double t101 = G2*m1*m3*t94;
	double t102 = pow(t92,2);
	double t103 = G2*m1*m2*t102*t84*(3.0/4.0);
	double t104 = pow(t97,2);
	double t105 = G2*m1*m3*t104*t87*(3.0/4.0);
	double t106 = t100-t90;
	double t107 = r2x-r3x;
	double t108 = r2y-r3y;
	double t109 = t83-t85;
	double t110 = pow(t107,2);
	double t111 = pow(t108,2);
	double t112 = t110+t111;
	double t113 = pow((1.0/t112),(5.0/2.0));
	double t114 = pow((1.0/t112),(3.0/2.0));
	double t115 = pow(t109,2);
	double t116 = G2*m2*m3*t113*t115*(3.0/4.0);
	double t117 = t91-t96;
	double t118 = G2*m2*m3*t109*t113*t117*(3.0/4.0);
	double t119 = t100-t103;
	double t120 = t118+t93;
	double t121 = G2*m2*m3*t114;
	double t122 = pow(t117,2);
	double t123 = G2*m2*m3*t113*t122*(3.0/4.0);
	double t124 = pow(t95,2);
	double t127 = G2*m1*m3*t124*t87*(3.0/4.0);
	double t125 = t101-t127;
	double t126 = -1*t116+t121;
	double t128 = t101-t105;
	double t129 = t121-t123;
	double t130 = t118+t98;

	int colunas=3*2*2;

	j[0*colunas+6]=1/m1;
	j[1*colunas+7]=1/m1;
	j[2*colunas+8]=1/m2;
	j[3*colunas+9]=1/m2;
	j[4*colunas+10]=1/m3;
	j[5*colunas+11]=1/m3;
	j[6*colunas+0]=t90-G2*m1*m2*t88-G2*m1*m3*t94+G2*m1*m3*pow(t79,2)*t87*(3.0/4.0);
	j[6*colunas+1]=t99;
	j[6*colunas+2]=t106;
	j[6*colunas+3]=-t93;
	j[6*colunas+4]=t125;
	j[6*colunas+5]=-t98;
	j[7*colunas+0]=j[0*colunas+1];
	j[7*colunas+1]=-t100-t101+t103+t105;
	j[7*colunas+2]=-t93;
	j[7*colunas+3]=t119;
	j[7*colunas+4]=-t98;
	j[7*colunas+5]=t128;
	j[8*colunas+0]= t106;
	j[8*colunas+1]=-t93;
	j[8*colunas+2]=-t100+t116+t90-G2*m2*m3*t114;
	j[8*colunas+3]=t120;
	j[8*colunas+4]=t126;
	j[8*colunas+5]=-t118;
	j[9*colunas+0]=-t93;
	j[9*colunas+1]=t119;
	j[9*colunas+2]=t120;
	j[9*colunas+3]=-t100+t103-t121+t123;
	j[9*colunas+4]=-t118;
	j[9*colunas+5]=t129;
	j[10*colunas+0]=t125;
	j[10*colunas+1]=-t98;
	j[10*colunas+2]=t126;
	j[10*colunas+3]=-t118;
	j[10*colunas+4]=-t101+t116-t121+t127;
	j[10*colunas+5]=t130;
	j[11*colunas+0]=-t98;
	j[11*colunas+1]=t128;
	j[11*colunas+2]=-t118;
	j[11*colunas+3]=t129;
	j[11*colunas+4]=t130;
	j[11*colunas+5]=-t101+t105-t121+t123;
}

void produtoEscalar(double* v,double* v2,int tamanho, double *resultado)
{
	int i;

	*resultado=0;
	for(i=0;i<tamanho;i++)
	{
		*resultado+=v[i]*v2[i];
	}
}

void somaVetores(double* v,double* v2,int tamanho, double *resultado)
{
	int i;

	for(i=0;i<tamanho;i++)
	{
		resultado[i]=v[i]+v2[i];
	}
}

void produtoEscalarVetor(double* v,double a,int tamanho,double *resultado)
{
	int i;

	for(i=0;i<tamanho;i++)
	{
		resultado[i]=a*v[i];
	}
}

void produtoMatrizVetor(double *J,double* delta,int tamanho, double *resultado)
{
	int i,j;
	double temp;

	for(i=0;i<tamanho;i++)
	{
		temp=J[i*tamanho]*delta[0];
		for(j=1;j<tamanho;j++)
		{
			temp+=J[i*tamanho+j]*delta[j];
		}
		resultado[i]=temp;
	}
}

void escreverArquivos(double tempo)
{
	int j,k;
	char *aux;
	aux=(char*)calloc(1000,sizeof(char));

	for(k=0;k<corpos;k++)
	{
		for(j=0;j<dimensao;j++)
		{
			//printf("%lf\n", tempo);
			//arquivo txt
			//posicao
			sprintf(aux,"%0.20lf ",z[k*dimensao+j]);
			fputs(aux,f[k]);
			//momento
			sprintf(aux,"%0.20lf ",z[(k+corpos)*dimensao+j]);
			fputs(aux,f[k+corpos]);
		}
		fputs("\n",f[k]);
		fputs("\n",f[k+corpos]);
	}

	sprintf(aux,"%0.20lf ",z[4*corpos*dimensao]);
	fputs(aux,f[2*corpos+1]);
	fputs("\n",f[2*corpos+1]);

	if(tempo==0)
	{
		tempo=1;
	}
	sprintf(aux,"%0.20lf ",z[4*corpos*dimensao+1]/tempo);
	fputs(aux,f[2*corpos+2]);
	fputs("\n",f[2*corpos+2]);
	free(aux);

}

void fecharArquivos(void)
{
	char *aux;
	aux=(char*)calloc(1000,sizeof(char));

	int NFiles= (corpos*dimensao)+3;
	int i;
	sprintf(aux,"tempo de execucao= %0.3lf s",tempo);
	strcat(aux,"\n");
	fputs(aux,f[NFiles-3]);

	for(i=0;i<NFiles;i++)
	{
		//printf("%d\n",i);
		fclose(f[i]);
	}

	free(aux);
}
